package com.qf.service;

import com.qf.config.IdWorker;
import com.qf.constant.CacheConstants;
import com.qf.constant.RabbitMQConstants;
import com.qf.constant.ReportStateConstants;
import com.qf.constant.SourceType;
import com.qf.feign.CacheFeign;
import com.qf.form.SmsInterfaceForm;
import com.qf.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @author WuZiYu
 * @date 2022-6-3 上午 12:07
 */
@Service
@Slf4j
public class interfaceServiceImpl implements InterfaceService {

    @Autowired
    private CacheFeign cacheFeign;
    @Autowired
    private IdWorker idWorker;
    @Autowired
    private RabbitTemplate rabbitTemplate;

    /**
     * 客户端传递的SmsInterfaceForm 里面属性  进行非空校验
     *
     * @param smsInterfaceForm
     * @return
     */
    @Override
    public Map check(SmsInterfaceForm smsInterfaceForm) {
        Map resultMap = new HashMap();
        String clientID = smsInterfaceForm.getClientID();
        //2  客户的所有信息
        //Map map = cacheFeign.hMGet(CacheConstants.CACHE_PREFIX_BLACK + clientID);
        Map map = cacheFeign.hMGet(CacheConstants.CACHE_PREFIX_CLIENT + clientID);//CLIENT:6

        if (map == null || map.size() == 0) {
            resultMap.put("code", "101");
            resultMap.put("msg", "认证错：clientId错误");
            return resultMap;
        }
//        **校验的方法有：**
//
//        - 手机号合法性
        String mobile = smsInterfaceForm.getMobile();
        String[] mobileArray = mobile.split(",");
        if (null != mobileArray && mobileArray.length > 100) {
            resultMap.put("code", "105");
            resultMap.put("msg", "手机号太多了");
            return resultMap;
        }
        //手机号是不是手机号
        String regex = "^(13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\\d{8}$";
        for (String m : mobileArray) {
            if (!m.matches(regex)) {
                resultMap.put("code", "105");
                resultMap.put("msg", "手机号错误");
                return resultMap;
            }
        }
//                - 客户IP的合法性
        String ip = smsInterfaceForm.getIp();
        String ipAddress = (String) map.get("ipaddress");
        boolean flag = false;
        for (String s : ipAddress.split(",")) {
            if(!StringUtils.isEmpty(ip) && ip.equals(s)){
                // 当前用户的ip地址,是白名单内的
                flag = true;
                break;
            }
        }
        //3.4 如果ip不属于白名单  // localhost的ip地址是0:0:0:0:0:0:0:1
        if(!flag){
            log.info("【接口模块】 IP校验错误。  ip={}",ip);
            resultMap.put("code", "103");
            resultMap.put("msg", "IP校验错误");
            return resultMap;
        }
//                - 客户密码的合法性
        //2.1 获取用户输入的pwd
        String pwd = smsInterfaceForm.getPwd();
        //2.2 判断两个pwd是否相等
        if(StringUtils.isEmpty(pwd) || !pwd.equals(map.get("pwd"))){
            // 没传递密码,或者密码错误
            log.info("【接口模块】 密码错误。  pwd={}",pwd);
            resultMap.put("code", "102");
            resultMap.put("msg", "密码错误");
            return resultMap;
        }
//                - 用户发送信息的长度
        //4.1 校验短信长度
        String content = smsInterfaceForm.getContent();
        //4.2 校验非空和长度
        if(StringUtils.isEmpty(content) || content.length() > 500){
            log.info("【接口模块】 消息长度错，为空或超长（目前定为500个字）。  content={}",content);
            resultMap.put("code", "104");
            resultMap.put("msg", "消息长度错，为空或超长（目前定为500个字）");
            return resultMap;
        }

//
//        为了加快处理速度，客户校验信息从缓存中读取.


        resultMap.put("code", "0");
        resultMap.put("msg", "接收成功");

        for (String m : mobileArray) {
            //为了高并发大量短信  只能发送RabbitMQ 削峰
            StandardSubmit standardSubmit = new StandardSubmit();

            //当前唯一ID  idWorker
            standardSubmit.setSequenceId(String.valueOf(idWorker.nextId()));

            //优先级
            standardSubmit.setMessagePriority(Short.parseShort((String) map.get("priority")));
            /**
             * 客户侧唯一序列号
             */
            standardSubmit.setSrcSequenceId(Long.parseLong(smsInterfaceForm.getSrcID()));
            /**
             * 客户端ID
             */
            standardSubmit.setClientID(Integer.parseInt(clientID));
            //手机号
            standardSubmit.setDestMobile(m);

            standardSubmit.setMessageContent(smsInterfaceForm.getContent());
            //等待
            standardSubmit.setReportState(ReportStateConstants.WAIT);

            standardSubmit.setSendTime(new Date());
            // api  : http:
            standardSubmit.setSource(SourceType.HTTP);
            //发消息   RabbitMQ服务端
            rabbitTemplate.convertAndSend(
                    RabbitMQConstants.TOPIC_PRE_SEND + "_exchange",
                    "routingKey", standardSubmit);
            //   pre_send_sms_topic_exchange

        }
        return resultMap;
    }
}
